package org.aynu.userservice.common;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Getter;
import lombok.Setter;

import java.io.Serial;
import java.io.Serializable;

/**
 * 类功能描述：
 * UserResponse 类是一个通用的响应类，用于封装服务层返回给前端或其他调用方的响应数据。
 * 它包含状态码、消息描述和返回数据三个部分，使用泛型 T 可以支持不同类型的数据返回。
 * 同时，通过 @JsonInclude(JsonInclude.Include.NON_NULL) 注解，在 JSON 序列化时会忽略值为 null 的字段，减少不必要的数据传输。
 *
 * @author 小粥
 * @date 2025/03/02
 */
@Getter
@Setter
@JsonInclude(JsonInclude.Include.NON_NULL) // 使 JSON 序列化时忽略 null 值
public class UserResponse<T> implements Serializable {
    @Serial
    private static final long serialVersionUID = 1L;

    private int code;        // 状态码，用于表示请求的处理结果状态，如 200 表示成功，500 表示服务器内部错误等
    private String message;  // 消息描述，用于对请求处理结果进行详细说明，例如操作成功、操作失败的具体原因等
    private T data;          // 返回数据，用于携带业务处理后需要返回给调用方的具体数据，数据类型由泛型 T 决定

    /**
     * 功能描述：
     * 私有构造方法，用于创建 UserResponse 对象。
     * 该方法接收状态码、消息描述和返回数据作为参数，将这些参数赋值给对象的相应属性。
     * 由于构造方法是私有的，外部无法直接调用，只能通过提供的静态工厂方法来创建 UserResponse 对象。
     *
     * @param code    状态码，用于表示请求的处理结果状态
     * @param message 消息描述，用于对请求处理结果进行详细说明
     * @param data    数据，用于携带业务处理后需要返回给调用方的具体数据
     * @author 小粥
     * @date 2025/03/02
     */
    private UserResponse(int code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    /**
     * 功能描述：
     * 静态工厂方法，用于创建表示操作成功的 UserResponse 对象。
     * 该方法默认状态码为 200，消息描述为 "操作成功"，并接收一个泛型类型的数据作为返回数据。
     * 调用该方法可以方便地创建一个成功响应对象，无需手动指定状态码和消息描述。
     *
     * @param data 数据，用于携带业务处理后需要返回给调用方的具体数据
     * @return {@link UserResponse}<{@link T}> 返回一个表示操作成功的 UserResponse 对象
     * @author 小粥
     * @date 2025/03/02
     */
    public static <T> UserResponse<T> success(T data) {
        return new UserResponse<>(200, "操作成功", data);
    }

    /**
     * 功能描述：
     * 静态工厂方法，用于创建表示操作成功的 UserResponse 对象。
     * 该方法默认状态码为 200，允许调用者自定义消息描述，并接收一个泛型类型的数据作为返回数据。
     * 当需要返回特定的成功消息时，可以使用该方法。
     *
     * @param message 消息，用于对操作成功的结果进行详细说明
     * @param data    数据，用于携带业务处理后需要返回给调用方的具体数据
     * @return {@link UserResponse}<{@link T}> 返回一个表示操作成功的 UserResponse 对象
     * @author 小粥
     * @date 2025/03/02
     */
    public static <T> UserResponse<T> success(String message, T data) {
        return new UserResponse<>(200, message, data);
    }

    /**
     * 功能描述：
     * 静态工厂方法，用于创建表示操作失败的 UserResponse 对象。
     * 该方法默认状态码为 500，允许调用者自定义错误消息，返回数据为 null。
     * 当业务处理出现错误时，可以使用该方法创建一个错误响应对象。
     *
     * @param message 消息，用于对操作失败的原因进行详细说明
     * @return {@link UserResponse}<{@link T}> 返回一个表示操作失败的 UserResponse 对象
     * @author 小粥
     * @date 2025/03/02
     */
    public static <T> UserResponse<T> error(String message) {
        return new UserResponse<>(500, message, null);
    }

}